home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
gtlayout-source.lha
/
LTP_LayoutGadgets.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-08
|
26KB
|
983 lines
/*
** GadTools layout toolkit
**
** Copyright © 1993-1996 by Olaf `Olsen' Barthel
** Freely distributable.
**
** :ts=4
*/
#ifndef _GTLAYOUT_GLOBAL_H
#include "gtlayout_global.h"
#endif
#ifdef DO_BOOPSI_KIND
STATIC VOID
LocalAddPart(STRPTR Base,STRPTR Name)
{
LONG Len = strlen(Base);
if(Base[Len - 1] != ':')
strcat(Base,"/");
strcat(Base,Name);
}
STATIC struct Library *
OpenClass(STRPTR Name)
{
struct Library *Result;
if(!(Result = OpenLibrary(Name,0)))
{
struct Process *Process = (struct Process *)FindTask(NULL);
UBYTE LocalBuffer[256];
LONG i,Len;
Len = strlen(Name);
for(i = Len - 1 ; i >= 0 ; i--)
{
if(Name[i] == '/' || Name[i] == ':')
{
Name = &Name[i + 1];
break;
}
}
if(Process->pr_Task.tc_Node.ln_Type == NT_PROCESS && Process->pr_HomeDir)
{
strcpy(LocalBuffer,"PROGDIR:Classes/Gadgets");
LocalAddPart(LocalBuffer,Name);
Result = OpenLibrary(LocalBuffer,0);
}
if(!Result)
{
strcpy(LocalBuffer,":Classes/Gadgets");
LocalAddPart(LocalBuffer,Name);
if(!(Result = OpenLibrary(LocalBuffer,0)))
{
strcpy(LocalBuffer,"Gadgets");
LocalAddPart(LocalBuffer,Name);
if(!(Result = OpenLibrary(LocalBuffer,0)))
Result = OpenLibrary(Name,0);
}
}
}
return(Result);
}
#endif /* DO_BOOPSI_KIND */
/*****************************************************************************/
VOID
LTP_LayoutGadgets(LayoutHandle *Handle,ObjectNode *Group,LONG Left,LONG Top,LONG PlusWidth,LONG PlusHeight)
{
if(!Handle->Failed)
{
STATIC struct TagItem NoUnderscoreVanillaTags[] =
{
{TAG_DONE}
};
STATIC struct TagItem VanillaTags[] =
{
{GT_Underscore, '_'},
{TAG_DONE}
};
STATIC struct TagItem DisabledTags[] =
{
{GT_Underscore, '_' },
{GA_Disabled, TRUE},
{TAG_DONE}
};
STATIC struct TagItem NoUnderscoreDisabledTags[] =
{
{GA_Disabled, TRUE},
{TAG_DONE}
};
struct NewGadget NewGadget;
struct Gadget *Gadget,
*Extra;
struct TagItem *Tags;
ULONG page;
ObjectNode *Node;
if(!Handle->List)
{
if(!(Handle->Previous = CreateContext(&Handle->List)))
{
Handle->Failed = TRUE;
return;
}
}
NewGadget.ng_TextAttr = Handle->TextAttr;
NewGadget.ng_VisualInfo = Handle->VisualInfo;
Group->Special.Group.Visible = TRUE;
SCANPAGE(Group,Node,page)
{
if(Node->Type != FRAME_KIND && Node->Type != BLANK_KIND && Node->Type != BOX_KIND && Node->Type != XBAR_KIND && Node->Type != YBAR_KIND)
{
Extra = NULL;
if(Node->GroupIndent)
{
NewGadget.ng_LeftEdge = Node->Left + 4;
NewGadget.ng_TopEdge = Node->Top + 2;
NewGadget.ng_Width = Node->Width - (4 + 4);
NewGadget.ng_Height = Node->Height - (2 + 2);
}
else
{
NewGadget.ng_LeftEdge = Node->Left;
NewGadget.ng_TopEdge = Node->Top;
NewGadget.ng_Width = Node->Width;
NewGadget.ng_Height = Node->Height;
}
NewGadget.ng_GadgetText = Node->Label ? Node->Label : (STRPTR)"";
NewGadget.ng_GadgetID = Node->ID;
NewGadget.ng_UserData = Node;
if(Node->NoKey)
{
if(Node->Disabled)
{
if(!V39 && (Node->Type == MX_KIND || Node->Type == LISTVIEW_KIND))
Tags = NoUnderscoreVanillaTags;
else
Tags = NoUnderscoreDisabledTags;
}
else
Tags = NoUnderscoreVanillaTags;
}
else
{
if(Node->Disabled)
{
if(!V39 && (Node->Type == MX_KIND || Node->Type == LISTVIEW_KIND))
Tags = VanillaTags;
else
Tags = DisabledTags;
}
else
Tags = VanillaTags;
}
switch(Node->LabelPlace)
{
case PLACE_LEFT:
NewGadget.ng_Flags = PLACETEXT_LEFT;
break;
case PLACE_RIGHT:
NewGadget.ng_Flags = PLACETEXT_RIGHT;
break;
case PLACE_ABOVE:
NewGadget.ng_Flags = PLACETEXT_ABOVE;
break;
case PLACE_BELOW:
NewGadget.ng_Flags = PLACETEXT_BELOW;
break;
case PLACE_IN:
NewGadget.ng_Flags = PLACETEXT_IN;
break;
default:
NewGadget.ng_Flags = NULL;
break;
}
if(Node->HighLabel)
NewGadget.ng_Flags |= NG_HIGHLABEL;
switch(Node->Type)
{
#ifdef DO_BOOPSI_KIND
case BOOPSI_KIND:
{
struct Gadget *Link;
if(Node->Special.BOOPSI.Link != NIL_LINK && Node->Special.BOOPSI.TagLink)
{
if(!(Link = LTP_FindGadget(Handle,Node->Special.BOOPSI.Link)))
{
Handle->Failed = TRUE;
return;
}
}
else
Link = NULL;
if(Node->Special.BOOPSI.ClassLibraryName)
{
if(!(Node->Special.BOOPSI.ClassBase = OpenClass(Node->Special.BOOPSI.ClassLibraryName)))
{
Gadget = NULL;
break;
}
}
if(Node->Special.BOOPSI.FullWidth)
{
NewGadget.ng_LeftEdge = Node->Special.BOOPSI.Parent->Left;
NewGadget.ng_Width = Node->Special.BOOPSI.Parent->Width;
}
if(Node->Special.BOOPSI.FullHeight)
{
NewGadget.ng_TopEdge = Node->Special.BOOPSI.Parent->Top;
NewGadget.ng_Height = Node->Special.BOOPSI.Parent->Height;
}
Gadget = NewObject(Node->Special.BOOPSI.ClassInstance,Node->Special.BOOPSI.ClassName,
GA_Left, NewGadget.ng_LeftEdge,
GA_Top, NewGadget.ng_TopEdge,
GA_Width, NewGadget.ng_Width,
GA_Height, NewGadget.ng_Height,
GA_Disabled, Node->Disabled,
GA_ID, Node->ID,
GA_UserData, Node,
Link ? Node->Special.BOOPSI.TagLink : TAG_IGNORE, Link,
Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE, Handle->BOOPSIPrevious,
Node->Special.BOOPSI.TagTextAttr ? Node->Special.BOOPSI.TagTextAttr : TAG_IGNORE, Handle->TextAttr,
Node->Special.BOOPSI.TagDrawInfo ? Node->Special.BOOPSI.TagDrawInfo : TAG_IGNORE, Handle->DrawInfo,
Node->Special.BOOPSI.TagScreen ? Node->Special.BOOPSI.TagScreen : TAG_IGNORE, Handle->Screen,
Node->Special.BOOPSI.ClassTags ? TAG_MORE : TAG_DONE, Node->Special.BOOPSI.ClassTags);
break;
}
#ifdef DO_POPUP_KIND
case POPUP_KIND:
Gadget = NewObject(LTP_PopupClass,NULL,
GA_Left, NewGadget.ng_LeftEdge,
GA_Top, NewGadget.ng_TopEdge,
GA_Width, NewGadget.ng_Width,
GA_Height, NewGadget.ng_Height,
GA_Disabled, Node->Disabled,
GA_ID, Node->ID,
GA_UserData, Node,
GA_RelVerify, TRUE,
PIA_Labels, Node->Special.Popup.Choices,
PIA_Active, Node->Current,
PIA_Font, Handle->TextAttr,
PIA_CentreActive, Node->Special.Popup.CentreActive,
Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
TAG_DONE);
break;
#endif // DO_POPUP_KIND
#ifdef DO_TAB_KIND
case TAB_KIND:
if(Node->Special.Tab.FullWidth)
{
NewGadget.ng_LeftEdge = Handle->TopGroup->Left - Left;
NewGadget.ng_Width = Handle->TopGroup->Width + PlusWidth;
NewGadget.ng_LeftEdge += Handle->Screen->WBorLeft;
NewGadget.ng_Width -= Handle->Screen->WBorLeft + Handle->Screen->WBorRight;
}
else
{
NewGadget.ng_LeftEdge = Node->Special.Tab.Parent->Left;
NewGadget.ng_Width = Node->Special.Tab.Parent->Width;
}
Gadget = NewObject(LTP_TabClass,NULL,
GA_Left, NewGadget.ng_LeftEdge,
GA_Top, NewGadget.ng_TopEdge,
GA_Width, NewGadget.ng_Width,
GA_Height, NewGadget.ng_Height,
GA_Disabled, Node->Disabled,
GA_ID, Node->ID,
GA_UserData, Node,
GA_RelVerify, TRUE,
TIA_Labels, Node->Special.Popup.Choices,
TIA_Index, Node->Current,
TIA_Font, Handle->TextAttr,
TIA_DrawInfo, Handle->DrawInfo,
TIA_Screen, Handle->Screen,
Handle->BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle->BOOPSIPrevious,
TAG_DONE);
break;
#endif // DO_TAB_KIND
#endif /* DO_BOOPSI_KIND */
#ifdef DO_LEVEL_KIND
case LEVEL_KIND:
if(Node->Special.Level.LevelImage = NewObject(LTP_LevelClass,NULL,
IA_Width, Node->Width,
IA_Height, Node->Height,
// IA_Left, 0,
// IA_Top, 0,
LVIA_Screen, Handle->Screen,
LVIA_DrawInfo, Handle->DrawInfo,
LVIA_FontWidth, Handle->GlyphWidth,
LVIA_Max, Node->Max - Node->Special.Level.Plus,
LVIA_Current, Node->Current - Node->Special.Level.Plus,
TAG_DONE))
{
NewGadget.ng_GadgetText = "";
NewGadget.ng_Flags = NULL;
if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
{
Gadget->GadgetType |= GTYP_CUSTOMGADGET;
Gadget->Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
Gadget->Activation = GACT_RELVERIFY | GACT_IMMEDIATE | GACT_FOLLOWMOUSE;
Gadget->MutualExclude = (ULONG)&Node->Special.Level.CustomHook;
Gadget->GadgetRender = Node->Special.Level.LevelImage;
Gadget->SelectRender = Node->Special.Level.LevelImage;
Gadget->SpecialInfo = &Node->Special.Level;
if(Node->Disabled)
Gadget->Flags |= GFLG_DISABLED;
}
}
else
Gadget = NULL;
break;
#endif /* DO_LEVEL_KIND */
case BUTTON_KIND:
#ifdef OLD_STYLE_DEFAULT_KEY
if(Node->Special.Button.Lines)
#else
if(Node->Special.Button.ReturnKey)
Handle->TextAttr->ta_Style |= FSF_BOLD;
if(Node->Special.Button.Lines || Node->Special.Button.ReturnKey)
#endif
{
if(Node->Special.Button.ButtonImage = NewObject(LTP_ImageClass,NULL,
IIA_ImageType, IMAGECLASS_MULTILINEBUTTON,
IIA_Lines, Node->Special.Button.Lines,
IIA_LineCount, Node->Special.Button.LineCount,
IIA_KeyStroke, Node->Special.Button.KeyStroke,
IIA_Emboss, Node->Special.Button.ReturnKey,
IIA_Label, Node->Label,
IIA_Font, Handle->TextAttr,
IA_Width, NewGadget.ng_Width,
IA_Height, NewGadget.ng_Height,
TAG_DONE))
{
NewGadget.ng_GadgetText = "";
NewGadget.ng_Flags = NULL;
if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
{
Gadget->GadgetType |= GTYP_BOOLGADGET;
Gadget->Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
Gadget->Activation = GACT_RELVERIFY;
Gadget->GadgetRender = Node->Special.Button.ButtonImage;
Gadget->SelectRender = Node->Special.Button.ButtonImage;
if(Node->Disabled)
Gadget->Flags |= GFLG_DISABLED;
}
}
else
Gadget = NULL;
}
else
Gadget = CreateGadgetA(BUTTON_KIND,Handle->Previous,&NewGadget,Tags);
#ifndef OLD_STYLE_DEFAULT_KEY
if(Node->Special.Button.ReturnKey)
Handle->TextAttr->ta_Style &= ~FSF_BOLD;
#endif
break;
case GROUP_KIND:
LTP_LayoutGadgets(Handle,Node,Left,Top,PlusWidth,PlusHeight);
continue;
case CHECKBOX_KIND:
Gadget = CreateGadget(CHECKBOX_KIND,Handle->Previous,&NewGadget,
GTCB_Checked, Node->Current,
GTCB_Scaled, TRUE,
TAG_MORE,Tags);
break;
case LISTVIEW_KIND:
{
struct TextFont *LocalFont;
ULONG WhichTag;
if(!Node->Special.List.ReadOnly && Node->Special.List.LinkID != -1 && Node->Special.List.LinkID != NIL_LINK)
Gadget = Node->Special.List.Link = LTP_FindGadget(Handle,Node->Special.List.LinkID);
else
Gadget = NULL;
if((NewGadget.ng_Flags & PLACETEXT_ABOVE) && Node->Label && Node->Special.List.FlushLabelLeft)
NewGadget.ng_GadgetText = "";
if(Node->Special.List.TextAttr)
{
// Use the system default font?
if(Node->Special.List.TextAttr == (struct TextAttr *)~0)
{
Forbid();
LTP_GetDefaultFont(&Handle->FixedFont);
if(!(LocalFont = OpenFont((struct TextAttr *)&Handle->FixedFont)))
{
Permit();
Handle->Failed = TRUE;
Gadget = NULL;
break;
}
NewGadget.ng_TextAttr = (struct TextAttr *)&Handle->FixedFont;
}
else
{
NewGadget.ng_TextAttr = Node->Special.List.TextAttr;
LocalFont = NULL;
}
NewGadget.ng_GadgetText = "";
}
if(V39)
WhichTag = GTLV_MakeVisible;
else
WhichTag = GTLV_Top;
Gadget = CreateGadget(LISTVIEW_KIND,Handle->Previous,&NewGadget,
GTLV_Selected, Node->Current,
GTLV_ReadOnly, Node->Special.List.ReadOnly,
GTLV_ScrollWidth, 2 + 2 * Handle->GlyphWidth + 2,
Node->Current >= 0 ? WhichTag : TAG_IGNORE, Node->Current,
Node->Special.List.Labels ? GTLV_Labels : TAG_IGNORE, Node->Special.List.Labels,
Node->Special.List.LinkID != -1 ? GTLV_ShowSelected : TAG_IGNORE, Gadget,
Node->Special.List.CallBack ? GTLV_CallBack : TAG_IGNORE, Node->Special.List.CallBack,
Node->Special.List.MaxPen ? GTLV_MaxPen : TAG_IGNORE, Node->Special.List.MaxPen,
TAG_MORE,Tags);
if(Node->Special.List.TextAttr)
{
NewGadget.ng_TextAttr = Handle->TextAttr;
if(LocalFont)
{
CloseFont(LocalFont);
Permit();
}
}
break;
}
case MX_KIND:
NewGadget.ng_Height = Handle->GlyphHeight;
Gadget = CreateGadget(MX_KIND,Handle->Previous,&NewGadget,
GTMX_Labels, Node->Special.Radio.Choices,
GTMX_Active, Node->Current,
GTMX_Spacing, Handle->InterHeight,
GTMX_Scaled, TRUE,
Node->Label ? GTMX_TitlePlace : TAG_IGNORE, Node->Special.Radio.TitlePlace,
TAG_MORE,Tags);
break;
case TEXT_KIND:
if(Node->Special.Text.UsePicker)
NewGadget.ng_Width -= LTP_GetPickerSize(Handle);
if(Gadget = CreateGadget(TEXT_KIND,Handle->Previous,&NewGadget,
GTTX_Border, Node->Special.Text.Border,
GTTX_Justification, Node->Special.Text.Justification,
GTTX_Clipped, TRUE,
Node->Special.Text.Text ? GTTX_Text : TAG_IGNORE,Node->Special.Text.Text,
Node->Special.Text.FrontPen != -1 ? GTTX_FrontPen : TAG_IGNORE,Node->Special.Text.FrontPen,
Node->Special.Text.BackPen != -1 ? GTTX_BackPen : TAG_IGNORE,Node->Special.Text.BackPen,
TAG_MORE,Tags))
{
if(Node->Special.Text.UsePicker)
{
Handle->Previous = Gadget;
Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
if(!Extra)
Gadget = NULL;
Node->Special.Text.Picker = Extra;
}
}
break;
#ifdef DO_GAUGE_KIND
case GAUGE_KIND:
NewGadget.ng_Height -= Handle->InterHeight + Handle->GlyphHeight + 2;
Gadget = CreateGadgetA(TEXT_KIND,Handle->Previous,&NewGadget,NULL);
break;
#endif
#ifdef DO_TAPEDECK_KIND
case TAPEDECK_KIND:
if(Node->Special.TapeDeck.ButtonType >= TDBT_BACKWARD && Node->Special.TapeDeck.ButtonType < TDBTLAST)
{
LONG ImageType;
LONG Activation,
Flags;
if(Node->Special.TapeDeck.Toggle)
Activation = GACT_TOGGLESELECT | GACT_IMMEDIATE;
else
{
if(Node->Special.TapeDeck.Tick)
{
Activation = GACT_RELVERIFY | GACT_IMMEDIATE;
Handle->IDCMP |= IDCMP_GADGETDOWN | IDCMP_GADGETUP | IDCMP_INTUITICKS;
}
else
Activation = GACT_RELVERIFY;
}
if(Node->Current)
Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_SELECTED;
else
Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
switch(Node->Special.TapeDeck.ButtonType)
{
case TDBT_BACKWARD:
ImageType = IMAGECLASS_BACKWARD;
break;
case TDBT_FORWARD:
ImageType = IMAGECLASS_FORWARD;
break;
case TDBT_PREVIOUS:
ImageType = IMAGECLASS_PREVIOUS;
break;
case TDBT_NEXT:
ImageType = IMAGECLASS_NEXT;
break;
case TDBT_RECORD:
ImageType = IMAGECLASS_RECORD;
break;
case TDBT_PLAY:
ImageType = IMAGECLASS_PLAY;
break;
case TDBT_STOP:
ImageType = IMAGECLASS_STOP;
break;
case TDBT_PAUSE:
ImageType = IMAGECLASS_PAUSE;
break;
case TDBT_REWIND:
ImageType = IMAGECLASS_REWIND;
break;
case TDBT_EJECT:
ImageType = IMAGECLASS_EJECT;
break;
}
if(Node->Special.TapeDeck.ButtonImage = NewObject(LTP_ImageClass,NULL,
IIA_ImageType, ImageType,
IIA_GlyphWidth, Node->Special.TapeDeck.ButtonWidth,
IIA_GlyphHeight,Node->Special.TapeDeck.ButtonHeight,
IA_Width, NewGadget.ng_Width,
IA_Height, NewGadget.ng_Height,
TAG_DONE))
{
NewGadget.ng_GadgetText = "";
NewGadget.ng_Flags = NULL;
if(Gadget = CreateGadgetA(GENERIC_KIND,Handle->Previous,&NewGadget,NULL))
{
Gadget->GadgetType |= GTYP_BOOLGADGET;
Gadget->Flags |= Flags;
Gadget->Activation |= Activation;
Gadget->GadgetRender = Node->Special.TapeDeck.ButtonImage;
Gadget->SelectRender = Node->Special.TapeDeck.ButtonImage;
if(Node->Disabled)
Gadget->Flags |= GFLG_DISABLED;
}
}
else
Gadget = NULL;
}
break;
#endif /* DO_TAPEDECK_KIND */
case NUMBER_KIND:
Gadget = CreateGadget(NUMBER_KIND,Handle->Previous,&NewGadget,
GTNM_Number, Node->Special.Number.Number,
GTNM_Border, Node->Special.Number.Border,
GTNM_Justification, Node->Special.Number.Justification,
GTNM_Border, Node->Special.Number.Border,
GTNM_Format, Node->Special.Number.Format ? Node->Special.Number.Format : (STRPTR)"%ld",
GTNM_Clipped, TRUE,
GTNM_MaxNumberLen, Node->Special.Number.MaxNumberLen,
Node->Special.Number.FrontPen != -1 ? GTNM_FrontPen : TAG_IGNORE,Node->Special.Number.FrontPen,
Node->Special.Number.BackPen != -1 ? GTNM_BackPen : TAG_IGNORE,Node->Special.Number.BackPen,
TAG_MORE,Tags);
break;
case CYCLE_KIND:
Gadget = CreateGadget(CYCLE_KIND,Handle->Previous,&NewGadget,
GTCY_Labels, Node->Special.Cycle.Choices,
GTCY_Active, Node->Current,
TAG_MORE,Tags);
break;
case PALETTE_KIND:
if(Node->Special.Palette.UsePicker)
{
NewGadget.ng_Width = Node->Special.Palette.IndicatorWidth;
if(Gadget = CreateGadget(TEXT_KIND,Handle->Previous,&NewGadget,TAG_MORE,Tags))
{
Handle->Previous = Gadget;
Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
if(!Extra)
Gadget = NULL;
Node->Special.Palette.Picker = Extra;
}
}
else
{
Gadget = CreateGadget(PALETTE_KIND,Handle->Previous,&NewGadget,
GTPA_Depth, Node->Special.Palette.Depth,
GTPA_Color, Node->Current,
GTPA_ColorOffset, Node->Min,
GTPA_IndicatorWidth, MAX(10,Node->Width / (Node->Max - Node->Min + 1)),
GTPA_IndicatorHeight, Node->Height,
Node->Special.Palette.ColourTable ? GTPA_ColorTable : TAG_IGNORE,Node->Special.Palette.ColourTable,
TAG_MORE,Tags);
}
break;
case SLIDER_KIND:
Gadget = CreateGadget(SLIDER_KIND,Handle->Previous,&NewGadget,
GTSL_Min, Node->Min,
GTSL_Max, Node->Max,
GTSL_Level, Node->Current,
GTSL_MaxLevelLen, Node->Special.Slider.MaxLevelLen,
GTSL_LevelPlace, Node->Special.Slider.LevelPlace,
GTSL_LevelFormat, Node->Special.Slider.LevelFormat ? Node->Special.Slider.LevelFormat : (STRPTR)"%ld",
GA_RelVerify, TRUE,
V40 ? GTSL_MaxPixelLen : TAG_IGNORE, Node->Special.Slider.LevelWidth,
V40 ? GTSL_Justification : TAG_IGNORE, GTJ_RIGHT,
Node->Special.Slider.DispFunc ? GTSL_DispFunc : TAG_IGNORE, Node->Special.Slider.DispFunc,
TAG_MORE,Tags);
break;
case SCROLLER_KIND:
Gadget = CreateGadget(SCROLLER_KIND,Handle->Previous,&NewGadget,
GA_RelVerify, Node->Special.Scroller.RelVerify,
GA_Immediate, Node->Special.Scroller.Immediate,
GTSC_Top, Node->Current,
GTSC_Total, Node->Max,
GTSC_Visible, Node->Special.Scroller.Visible,
PGA_Freedom, Node->Special.Scroller.Vertical ? LORIENT_VERT : LORIENT_HORIZ,
Node->Special.Scroller.Arrows ? GTSC_Arrows : TAG_IGNORE,Node->Special.Scroller.ArrowSize,
TAG_MORE,Tags);
break;
case STRING_KIND:
if(Node->Special.String.LinkID != -1)
{
ObjectNode *ListView = LTP_FindNode(Handle,Node->Special.String.LinkID);
if(ListView)
{
NewGadget.ng_LeftEdge = ListView->Left;
NewGadget.ng_TopEdge = ListView->Top + ListView->Height;
NewGadget.ng_Width = ListView->Width;
}
}
if(Node->Special.String.UsePicker)
NewGadget.ng_Width -= LTP_GetPickerSize(Handle);
if(Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
GTST_String, Node->Special.String.String,
GTST_MaxChars, Node->Special.String.MaxChars,
GTST_EditHook, Node->Special.String.EditHook ? Node->Special.String.EditHook : Handle->StandardEditHook,
GA_Immediate, TRUE,
STRINGA_Justification, Node->Special.String.Justification,
STRINGA_ExitHelp, Handle->HelpHook != NULL,
TAG_MORE,Tags))
{
if(!V39)
Gadget->Activation |= GACT_IMMEDIATE;
if(Node->Special.String.UsePicker)
{
Handle->Previous = Gadget;
Extra = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_PICKER,0);
if(!Extra)
Gadget = NULL;
Node->Special.String.Picker = Extra;
}
}
break;
#ifdef DO_PASSWORD_KIND
case PASSWORD_KIND:
{
LONG Len;
if(Len = strlen(Node->Special.String.RealString))
memset(Node->Special.String.Original,'·',Len);
Node->Special.String.Original[Len] = 0;
if(Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
GTST_String, Node->Special.String.Original,
GTST_MaxChars, Node->Special.String.MaxChars,
GTST_EditHook, &Handle->PasswordEditHook,
GA_Immediate, TRUE,
STRINGA_Justification, Node->Special.String.Justification,
STRINGA_ExitHelp, Handle->HelpHook != NULL,
TAG_MORE,Tags))
{
if(!V39)
Gadget->Activation |= GACT_IMMEDIATE;
}
break;
}
#endif
case INTEGER_KIND:
if(Node->Special.Integer.UseIncrementers)
{
NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
NewGadget.ng_Width -= 4 + Handle->GlyphWidth + 4;
if(Node->Special.Integer.IncrementerHook)
{
LONG Value;
Value = (LONG)CallHookPkt(Node->Special.Integer.IncrementerHook,(APTR)Node->Special.Integer.Number,(APTR)INCREMENTERMSG_INITIAL);
if(Value < Node->Min)
Value = Node->Min;
else
{
if(Value > Node->Max)
Value = Node->Max;
}
Node->Special.Integer.Number = Value;
}
}
#ifndef DO_HEXHOOK
Gadget = CreateGadget(INTEGER_KIND,Handle->Previous,&NewGadget,
GTIN_Number, Node->Special.Integer.Number,
GTIN_MaxChars, Node->Special.Integer.MaxChars,
GTIN_EditHook, Node->Special.Integer.EditHook ? Node->Special.Integer.EditHook : Handle->StandardEditHook,
GA_Immediate, TRUE,
STRINGA_Justification, Node->Special.Integer.Justification,
STRINGA_ExitHelp, Handle->HelpHook != NULL,
TAG_MORE,Tags);
#else
if(Node->Special.Integer.EditHook)
{
Gadget = CreateGadget(INTEGER_KIND,Handle->Previous,&NewGadget,
GTIN_Number, Node->Special.Integer.Number,
GTIN_MaxChars, Node->Special.Integer.MaxChars,
GTIN_EditHook, Node->Special.Integer.EditHook,
GA_Immediate, TRUE,
STRINGA_Justification, Node->Special.Integer.Justification,
STRINGA_ExitHelp, Handle->HelpHook != NULL,
TAG_MORE,Tags);
}
else
{
UBYTE LocalBuffer[20];
SPrintf(LocalBuffer,"%ld",Node->Special.Integer.Number);
Gadget = CreateGadget(STRING_KIND,Handle->Previous,&NewGadget,
GTST_String, LocalBuffer,
GTST_MaxChars, Node->Special.Integer.MaxChars,
GTST_EditHook, &Handle->HexEditHook,
GA_Immediate, TRUE,
STRINGA_Justification, Node->Special.Integer.Justification,
STRINGA_ExitHelp, Handle->HelpHook != NULL,
TAG_MORE,Tags);
}
if(Gadget)
{
struct StringInfo *StringInfo = (struct StringInfo *)Gadget->SpecialInfo;
StringInfo->LongInt = Node->Special.Integer.Number;
}
#endif
if(Gadget)
{
if(!V39)
Gadget->Activation |= GACT_IMMEDIATE;
if(Node->Special.Integer.UseIncrementers)
{
Handle->Previous = Gadget;
if(Node->Special.Integer.LeftIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_LEFTINCREMENTER,-1))
{
Handle->Previous = Node->Special.Integer.LeftIncrementer;
if(Node->Special.Integer.RightIncrementer = LTP_CreateExtraObject(Handle,Node,Gadget,&NewGadget,IMAGECLASS_RIGHTINCREMENTER,1))
Extra = Node->Special.Integer.RightIncrementer;
else
Gadget = NULL;
}
else
Gadget = NULL;
}
}
break;
}
if(Gadget)
{
Handle->GadgetArray[Handle->Index++] = Gadget;
Node->Host = Gadget;
#ifdef DO_BOOPSI_KIND
if(Node->Type == BOOPSI_KIND || Node->Type == POPUP_KIND || Node->Type == TAB_KIND)
{
Handle->BOOPSIPrevious = (Object *)Gadget;
if(!Handle->BOOPSIList)
Handle->BOOPSIList = (Object *)Gadget;
}
else
{
if(Extra)
Handle->Previous = Extra;
else
Handle->Previous = Gadget;
}
#else
if(Extra)
Handle->Previous = Extra;
else
Handle->Previous = Gadget;
#endif /* DO_BOOPSI_KIND */
}
else
{
Handle->Failed = TRUE;
return;
}
}
}
}
}